#ifndef TCPMEM_HH
#define TCPMEM_HH

#include "cms.hh"      /* class CMS */
#include "rem_msg.hh"  // REMOTE_CMS_REQUEST_TYPE

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif
class TCPMEM : public CMS
{
public:
    TCPMEM(const char* bufline, const char* procline);
    virtual ~TCPMEM();

    /* Overloaded CMS functions. */
    CMS_STATUS clear();
    int check_if_read();
    int get_msg_count();
    int get_queue_length();
    int get_space_available();
    CMS_STATUS read();
    CMS_STATUS blocking_read(double);
    CMS_STATUS peek();
    CMS_STATUS write(void* data, int* serial_number_out);
    CMS_STATUS write_if_read(void* data, int* serial_number_out);
    //    int login(const char *, const char *);
    void reconnect();
    void disconnect();
    CMS_DIAGNOSTICS_INFO* get_diagnostics_info();

protected:
    CMS_STATUS handle_old_replies();
    void send_diag_info();
    char diag_info_buf[0x400];
    int recvd_bytes;
    long serial_number;
    long returned_serial_number;
    int subscription_type;
    int poll_interval_millis;
    struct hostent* server_host_entry;
    struct sockaddr_in server_socket_address;
    int socket_fd;
    char temp_buffer[0x2000];
    REMOTE_CMS_REQUEST_TYPE timedout_request;
    long bytes_to_throw_away;
    int polling;
    int write_socket_fd;
    int read_socket_fd;
    long write_serial_number;
    long read_serial_number;
    void set_socket_fds(int new_fd);
    CMS_STATUS timedout_request_status;
    unsigned long timedout_request_writeid;
    int max_consecutive_timeouts;
    int waiting_for_message;
    unsigned long waiting_message_size;
    unsigned long waiting_message_id;
    int autoreconnect;
    int reconnect_needed;
    int sigpipe_count;
    void (*old_handler)(int);
    void disable_sigpipe();
    void reenable_sigpipe();
    void verify_bufname();
    int subscription_count;
};

#endif
